package com.levi.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author shentong
 * @since 2022/3/8 9:50 PM 拦截器应用场景
 *
 * 拦截器本质上是面向切面编程（AOP），符合横切关注点的功能都可以放在拦截器中来实现，主要的应用场景包括：
 *
 * 登录验证，判断用户是否登录。 权限验证，判断用户是否有权限访问资源，如校验token 日志记录，记录请求操作日志（用户ip，访问时间等），以便统计请求访问量。
 * 处理cookie、本地化、国际化、主题等。 性能监控，监控请求处理时长等。
 * 通用行为：读取cookie得到用户信息并将用户对象放入请求，从而方便后续流程使用，还有如提取Locale、Theme信息等，只要是多个处理器都需要的即可使用拦截器实现）
 */
@Slf4j
@Component
public class UriInterceptor implements HandlerInterceptor {

	public static final String URI = "getAll";

	private static final String GET_HEADER = "getHeader";

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		log.info("方法处理之前");
		String requestURI = request.getRequestURI();
		if (requestURI.contains(URI)) {
			return true;
		}
		if (requestURI.contains(GET_HEADER)) {
			response.sendRedirect("/test/getAll");
		}
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		log.info("方法处理之后，渲染视图之前");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		log.info("渲染视图之后");
	}

}
